// 小蓝正在一个瓜摊上买瓜。瓜摊上共有n个瓜，每个瓜的重量为Ai。
// 小蓝刀功了得，他可以把任何瓜劈成完全等重的两份，不过每个瓜只能劈一刀。
// 小蓝希望买到的瓜的重量的和恰好为m。
// 请问小蓝至少要劈多少个瓜才能买到重量恰好为m的瓜。如果无论怎样小蓝都无法得到总重恰好为m的瓜，请输出―1。

// 输入的第一行包含两个整数n，m，用一个空格分隔，分别表示瓜的个数和小蓝想买到的瓜的总重量。
// 第二行包含n个整数A，相邻整数之间使用一个空格分隔，分别表示每个瓜的重量。

// 输出一行包含一个整数表示答案。

// DFS深度遍历
// 对于每一个瓜有三种选择:
// 1)买整个瓜
// 2)买半个瓜，需要增加劈瓜次数
// 3)不买

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 30; 
int INF = 100;
int n,m;
int v[N]; //重量数组
long suf[N+1]; //重量数组的后缀数组
int ans = INF; //将结果初始化为INF
/*
dfs搜索,参数分别表示当前层数,当前重量之和,切瓜的次数
*/
void dfs(int pos,long sum,int cnt){
    if(sum==m){ //找到了一个结果
        ans = min(ans,cnt);
        return;
    }
    //剪枝
    if(pos>=n || cnt>=ans || sum>m || sum+suf[pos]<m) return;
    //对三种选择进行搜索
    dfs(pos+1,sum+v[pos],cnt); 
    dfs(pos+1,sum+v[pos]/2,cnt+1);
    dfs(pos+1,sum,cnt);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;
    m*=2; //总重量乘2
    for(int i=0;i<n;i++) cin>>v[i],v[i]*=2;
    sort(v,v+n,greater<int>());
    for(int i=n-1;i>=0;i--) suf[i] = suf[i+1]+v[i];
    dfs(0,0,0);
    if(ans==INF) cout<<-1;
    else cout<<ans;
    return 0;
}